import cv2 as cv
import numpy as np
# 打开摄像头
cap = cv.VideoCapture(0)
while True:
    # 读取摄像头的一帧
    ret, frame = cap.read()
    if not ret:
        print("无法从摄像头获取帧")
        break
    # 将 BGR 帧转换为 HSV 颜色空间
    hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    # 定义红色的 HSV 范围
    lower_red1 = np.array([0, 120, 70])
    upper_red1 = np.array([10, 255, 255])
    lower_red2 = np.array([170, 120, 70])
    upper_red2 = np.array([180, 255, 255])
    # 创建两个掩膜，分别对应红色的低端和高端
    mask1 = cv.inRange(hsv, lower_red1, upper_red1)
    mask2 = cv.inRange(hsv, lower_red2, upper_red2)
    # 合并掩膜，提取所有红色区域
    mask = mask2
    # 对掩膜进行形态学操作，去除噪点（可选）
    mask = cv.morphologyEx(mask, cv.MORPH_OPEN, np.ones((3, 3), np.uint8))
    mask = cv.morphologyEx(mask, cv.MORPH_CLOSE, np.ones((3, 3), np.uint8))
    # 找到红色区域的轮廓
    contours, _ = cv.findContours(mask, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    # 在原图上绘制轮廓
    for contour in contours:
        if cv.contourArea(contour) > 500:  # 过滤掉较小的轮廓
            x, y, w, h = cv.boundingRect(contour)  # 获取包围轮廓的矩形框
            cv.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)  # 绘制矩形框
    # 显示原始帧和红色区域的掩膜
    cv.imshow('Original Frame', frame)
    cv.imshow('Red Object Mask', mask)
    # 按下 'q' 键退出
    if cv.waitKey(1) & 0xFF == ord('q'):
        break
# 释放摄像头并关闭所有窗口
cap.release()
cv.destroyAllWindows()
